const { addUser, findUser } = require("../model/users")
//引入bcrypt加密的库
const bcrypt = require("bcrypt")
const regist = async function (req, res, next) {
    //req是请求对象
    console.log(req.body) //接收post请求传递的参数

    let { username, password } = req.body;

    //如果用户名和密码有一个未传递 我们需要向客户端返回错误

    if (!username || !password) {
        res.status(403) //服务器响应状态码
        res.send({ state: false, status: 403, msg: "用户名或密码未传递" })
        return
    }


    //判断数据库中是否存在这用户

    //1.查找的时候返回的结果是数组
    //2.如果数组的长度是0,说明不存在这个用户,可以注册
    //3.如果数组有长度说明用户存在,不允许注册,返回错误

    let findRes = await findUser({ username })

    console.log("findRes==", findRes)
    //解构数据
    let { state: findResState, res: resArray } = findRes

    if (findResState) {
        //查找成功了
        if (resArray.length > 0) {
            //用户名重复
            res.send({ state: false, status: 10023, msg: "用户名已存在" })
            return
        } else {
            //可以注册
            //1.将数据插入到数据库
            //2.将插入的结果返回给用户
            //3.存到数据库之前,对密码进行加密
            let saltRounds = 10; //杂凑运算次数

            let hashPass = await bcrypt.hash(password, saltRounds) //加密密码
            //将req.body中未加密的密码换成加密的密码
            req.body.password = hashPass;
            let result = await addUser(req.body)
            // console.log(result)
            //
            let { state } = result;

            if (state) {
                res.send({ state, status: 200, msg: "注册成功" })
            } else {
                res.send({ state, status: 1002, msg: result.errMsg })
            }
        }
    } else {
        //查找出错了
        res.send({ state: false, status: 10022, msg: findRes.errMsg })
    }

    //加盐


}


//登入接口

const login = async (req, res) => {

    //1.获取客户端传过来的用户名和密码

    let { username, password } = req.body;

    if (!username || !password) {
        res.send({ state: false, status: 4003, msg: "用户名或密码少传递了" })
        return
    }

    //2.根据用户名到数据库进行查找  

    let findRes = await findUser({ username })
    // console.log(findRes)
    //查找到了结果 将用户加密过的密码取出来 => 和当前传入的密码进行校验

    if (findRes.state) {
        //查询成功
        if (findRes.res.length) {
            //有长度说明存在这个用户
            //取出当前用户存到数据库的加密密码
            let hashPass = findRes.res[0].password
            //进行校验
            let verifyRes = await bcrypt.compare(password, hashPass)
            console.log(verifyRes)
            if (verifyRes) {
                //校验通过
                res.send({ state: true, status: 200, msg: "登入成功", userInfo: { ...findRes.res[0]._doc, password: '不告诉你' } })
            } else {
                //校验不通过
                res.send({ state: false, status: 1003, msg: "用户名或密码错误" })
            }
        } else {
            //不存在这个用户
            res.send({ state: false, status: 1003, msg: "用户不存在" })
        }
    } else {
        //查询失败
        res.send({ state: false, status: 1002, msg: "查找出错" })
    }

    //找不到结果 返回错误 用户不存在

    //3.校验密码 
    //校验通过 返回登入成功
    //校验不通过 返回用户名或者密码错误


}

module.exports = {
    regist,
    login
}